11a2b3536SDjordje Todorovic //===- Debugify.h - Check debug info preservation in optimizations --------===//
225ee8613SDaniel Sanders //
325ee8613SDaniel Sanders // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
425ee8613SDaniel Sanders // See https://llvm.org/LICENSE.txt for license information.
525ee8613SDaniel Sanders // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
625ee8613SDaniel Sanders //
725ee8613SDaniel Sanders //===----------------------------------------------------------------------===//
825ee8613SDaniel Sanders ///
91a2b3536SDjordje Todorovic /// \file Interface to the `debugify` synthetic/original debug info testing
101a2b3536SDjordje Todorovic /// utility.
1125ee8613SDaniel Sanders ///
1225ee8613SDaniel Sanders //===----------------------------------------------------------------------===//
1325ee8613SDaniel Sanders 
14aa5c09beSKazu Hirata #ifndef LLVM_TRANSFORMS_UTILS_DEBUGIFY_H
15aa5c09beSKazu Hirata #define LLVM_TRANSFORMS_UTILS_DEBUGIFY_H
1625ee8613SDaniel Sanders 
1725ee8613SDaniel Sanders #include "llvm/ADT/MapVector.h"
1830b015dbSDjordje Todorovic #include "llvm/ADT/StringRef.h"
1930b015dbSDjordje Todorovic #include "llvm/Bitcode/BitcodeWriterPass.h"
2030b015dbSDjordje Todorovic #include "llvm/IR/IRPrintingPasses.h"
2130b015dbSDjordje Todorovic #include "llvm/IR/LegacyPassManager.h"
2225ee8613SDaniel Sanders #include "llvm/IR/PassManager.h"
231a2b3536SDjordje Todorovic #include "llvm/IR/ValueHandle.h"
24e188aae4Sserge-sans-paille #include "llvm/Pass.h"
251a2b3536SDjordje Todorovic 
2673777b4cSDjordje Todorovic using DebugFnMap =
2773777b4cSDjordje Todorovic     llvm::MapVector<const llvm::Function *, const llvm::DISubprogram *>;
2835490329SDjordje Todorovic using DebugInstMap = llvm::MapVector<const llvm::Instruction *, bool>;
2935490329SDjordje Todorovic using DebugVarMap = llvm::MapVector<const llvm::DILocalVariable *, unsigned>;
301a2b3536SDjordje Todorovic using WeakInstValueMap =
3135490329SDjordje Todorovic     llvm::MapVector<const llvm::Instruction *, llvm::WeakVH>;
321a2b3536SDjordje Todorovic 
331a2b3536SDjordje Todorovic /// Used to track the Debug Info Metadata information.
341a2b3536SDjordje Todorovic struct DebugInfoPerPass {
351a2b3536SDjordje Todorovic   // This maps a function name to its associated DISubprogram.
361a2b3536SDjordje Todorovic   DebugFnMap DIFunctions;
371a2b3536SDjordje Todorovic   // This maps an instruction and the info about whether it has !dbg attached.
381a2b3536SDjordje Todorovic   DebugInstMap DILocations;
391a2b3536SDjordje Todorovic   // This tracks value (instruction) deletion. If an instruction gets deleted,
401a2b3536SDjordje Todorovic   // WeakVH nulls itself.
411a2b3536SDjordje Todorovic   WeakInstValueMap InstToDelete;
42b9076d11SDjordje Todorovic   // Maps variable into dbg users (#dbg values/declares for this variable).
43b9076d11SDjordje Todorovic   DebugVarMap DIVariables;
441a2b3536SDjordje Todorovic };
451a2b3536SDjordje Todorovic 
461adeeabbSDaniel Sanders namespace llvm {
471adeeabbSDaniel Sanders class DIBuilder;
481adeeabbSDaniel Sanders 
491adeeabbSDaniel Sanders /// Add synthesized debug information to a module.
501adeeabbSDaniel Sanders ///
511adeeabbSDaniel Sanders /// \param M The module to add debug information to.
521adeeabbSDaniel Sanders /// \param Functions A range of functions to add debug information to.
531adeeabbSDaniel Sanders /// \param Banner A prefix string to add to debug/error messages.
541adeeabbSDaniel Sanders /// \param ApplyToMF A call back that will add debug information to the
551adeeabbSDaniel Sanders ///                  MachineFunction for a Function. If nullptr, then the
561adeeabbSDaniel Sanders ///                  MachineFunction (if any) will not be modified.
571adeeabbSDaniel Sanders bool applyDebugifyMetadata(
581adeeabbSDaniel Sanders     Module &M, iterator_range<Module::iterator> Functions, StringRef Banner,
591adeeabbSDaniel Sanders     std::function<bool(DIBuilder &, Function &)> ApplyToMF);
60122a6bfbSVedant Kumar 
61122a6bfbSVedant Kumar /// Strip out all of the metadata and debug info inserted by debugify. If no
62122a6bfbSVedant Kumar /// llvm.debugify module-level named metadata is present, this is a no-op.
63122a6bfbSVedant Kumar /// Returns true if any change was made.
64122a6bfbSVedant Kumar bool stripDebugifyMetadata(Module &M);
65122a6bfbSVedant Kumar 
661a2b3536SDjordje Todorovic /// Collect original debug information before a pass.
671a2b3536SDjordje Todorovic ///
681a2b3536SDjordje Todorovic /// \param M The module to collect debug information from.
691a2b3536SDjordje Todorovic /// \param Functions A range of functions to collect debug information from.
7073777b4cSDjordje Todorovic /// \param DebugInfoBeforePass DI metadata before a pass.
711a2b3536SDjordje Todorovic /// \param Banner A prefix string to add to debug/error messages.
721a2b3536SDjordje Todorovic /// \param NameOfWrappedPass A name of a pass to add to debug/error messages.
731a2b3536SDjordje Todorovic bool collectDebugInfoMetadata(Module &M,
741a2b3536SDjordje Todorovic                               iterator_range<Module::iterator> Functions,
7573777b4cSDjordje Todorovic                               DebugInfoPerPass &DebugInfoBeforePass,
761a2b3536SDjordje Todorovic                               StringRef Banner, StringRef NameOfWrappedPass);
771a2b3536SDjordje Todorovic 
781a2b3536SDjordje Todorovic /// Check original debug information after a pass.
791a2b3536SDjordje Todorovic ///
801a2b3536SDjordje Todorovic /// \param M The module to collect debug information from.
811a2b3536SDjordje Todorovic /// \param Functions A range of functions to collect debug information from.
8273777b4cSDjordje Todorovic /// \param DebugInfoBeforePass DI metadata before a pass.
831a2b3536SDjordje Todorovic /// \param Banner A prefix string to add to debug/error messages.
841a2b3536SDjordje Todorovic /// \param NameOfWrappedPass A name of a pass to add to debug/error messages.
851a2b3536SDjordje Todorovic bool checkDebugInfoMetadata(Module &M,
861a2b3536SDjordje Todorovic                             iterator_range<Module::iterator> Functions,
8773777b4cSDjordje Todorovic                             DebugInfoPerPass &DebugInfoBeforePass,
889f41c03fSDjordje Todorovic                             StringRef Banner, StringRef NameOfWrappedPass,
899f41c03fSDjordje Todorovic                             StringRef OrigDIVerifyBugsReportFilePath);
901a2b3536SDjordje Todorovic } // namespace llvm
911a2b3536SDjordje Todorovic 
921a2b3536SDjordje Todorovic /// Used to check whether we track synthetic or original debug info.
931a2b3536SDjordje Todorovic enum class DebugifyMode { NoDebugify, SyntheticDebugInfo, OriginalDebugInfo };
941a2b3536SDjordje Todorovic 
951a2b3536SDjordje Todorovic llvm::ModulePass *createDebugifyModulePass(
961a2b3536SDjordje Todorovic     enum DebugifyMode Mode = DebugifyMode::SyntheticDebugInfo,
971a2b3536SDjordje Todorovic     llvm::StringRef NameOfWrappedPass = "",
9873777b4cSDjordje Todorovic     DebugInfoPerPass *DebugInfoBeforePass = nullptr);
991a2b3536SDjordje Todorovic llvm::FunctionPass *createDebugifyFunctionPass(
1001a2b3536SDjordje Todorovic     enum DebugifyMode Mode = DebugifyMode::SyntheticDebugInfo,
1011a2b3536SDjordje Todorovic     llvm::StringRef NameOfWrappedPass = "",
10273777b4cSDjordje Todorovic     DebugInfoPerPass *DebugInfoBeforePass = nullptr);
10325ee8613SDaniel Sanders 
104*b5b6d3a4SNikola Tesic class NewPMDebugifyPass : public llvm::PassInfoMixin<NewPMDebugifyPass> {
105*b5b6d3a4SNikola Tesic   llvm::StringRef NameOfWrappedPass;
106*b5b6d3a4SNikola Tesic   DebugInfoPerPass *DebugInfoBeforePass = nullptr;
107*b5b6d3a4SNikola Tesic   enum DebugifyMode Mode = DebugifyMode::NoDebugify;
108*b5b6d3a4SNikola Tesic public:
109*b5b6d3a4SNikola Tesic   NewPMDebugifyPass(
110*b5b6d3a4SNikola Tesic       enum DebugifyMode Mode = DebugifyMode::SyntheticDebugInfo,
111*b5b6d3a4SNikola Tesic       llvm::StringRef NameOfWrappedPass = "",
112*b5b6d3a4SNikola Tesic       DebugInfoPerPass *DebugInfoBeforePass = nullptr)
NameOfWrappedPass(NameOfWrappedPass)113*b5b6d3a4SNikola Tesic       : NameOfWrappedPass(NameOfWrappedPass),
114*b5b6d3a4SNikola Tesic         DebugInfoBeforePass(DebugInfoBeforePass), Mode(Mode) {}
115*b5b6d3a4SNikola Tesic 
11625ee8613SDaniel Sanders   llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM);
11725ee8613SDaniel Sanders };
11825ee8613SDaniel Sanders 
1191a2b3536SDjordje Todorovic /// Track how much `debugify` information (in the `synthetic` mode only)
1201a2b3536SDjordje Todorovic /// has been lost.
12125ee8613SDaniel Sanders struct DebugifyStatistics {
12225ee8613SDaniel Sanders   /// Number of missing dbg.values.
12325ee8613SDaniel Sanders   unsigned NumDbgValuesMissing = 0;
12425ee8613SDaniel Sanders 
12525ee8613SDaniel Sanders   /// Number of dbg.values expected.
12625ee8613SDaniel Sanders   unsigned NumDbgValuesExpected = 0;
12725ee8613SDaniel Sanders 
12825ee8613SDaniel Sanders   /// Number of instructions with empty debug locations.
12925ee8613SDaniel Sanders   unsigned NumDbgLocsMissing = 0;
13025ee8613SDaniel Sanders 
13125ee8613SDaniel Sanders   /// Number of instructions expected to have debug locations.
13225ee8613SDaniel Sanders   unsigned NumDbgLocsExpected = 0;
13325ee8613SDaniel Sanders 
13425ee8613SDaniel Sanders   /// Get the ratio of missing/expected dbg.values.
getMissingValueRatioDebugifyStatistics13525ee8613SDaniel Sanders   float getMissingValueRatio() const {
13625ee8613SDaniel Sanders     return float(NumDbgValuesMissing) / float(NumDbgLocsExpected);
13725ee8613SDaniel Sanders   }
13825ee8613SDaniel Sanders 
13925ee8613SDaniel Sanders   /// Get the ratio of missing/expected instructions with locations.
getEmptyLocationRatioDebugifyStatistics14025ee8613SDaniel Sanders   float getEmptyLocationRatio() const {
14125ee8613SDaniel Sanders     return float(NumDbgLocsMissing) / float(NumDbgLocsExpected);
14225ee8613SDaniel Sanders   }
14325ee8613SDaniel Sanders };
14425ee8613SDaniel Sanders 
14525ee8613SDaniel Sanders /// Map pass names to a per-pass DebugifyStatistics instance.
14625ee8613SDaniel Sanders using DebugifyStatsMap = llvm::MapVector<llvm::StringRef, DebugifyStatistics>;
14725ee8613SDaniel Sanders 
1481a2b3536SDjordje Todorovic llvm::ModulePass *createCheckDebugifyModulePass(
1491a2b3536SDjordje Todorovic     bool Strip = false, llvm::StringRef NameOfWrappedPass = "",
1501a2b3536SDjordje Todorovic     DebugifyStatsMap *StatsMap = nullptr,
1511a2b3536SDjordje Todorovic     enum DebugifyMode Mode = DebugifyMode::SyntheticDebugInfo,
15273777b4cSDjordje Todorovic     DebugInfoPerPass *DebugInfoBeforePass = nullptr,
1539f41c03fSDjordje Todorovic     llvm::StringRef OrigDIVerifyBugsReportFilePath = "");
15439856d5dSFangrui Song 
1551a2b3536SDjordje Todorovic llvm::FunctionPass *createCheckDebugifyFunctionPass(
1561a2b3536SDjordje Todorovic     bool Strip = false, llvm::StringRef NameOfWrappedPass = "",
1571a2b3536SDjordje Todorovic     DebugifyStatsMap *StatsMap = nullptr,
1581a2b3536SDjordje Todorovic     enum DebugifyMode Mode = DebugifyMode::SyntheticDebugInfo,
15973777b4cSDjordje Todorovic     DebugInfoPerPass *DebugInfoBeforePass = nullptr,
1609f41c03fSDjordje Todorovic     llvm::StringRef OrigDIVerifyBugsReportFilePath = "");
16125ee8613SDaniel Sanders 
162*b5b6d3a4SNikola Tesic class NewPMCheckDebugifyPass
16325ee8613SDaniel Sanders     : public llvm::PassInfoMixin<NewPMCheckDebugifyPass> {
164*b5b6d3a4SNikola Tesic   llvm::StringRef NameOfWrappedPass;
165*b5b6d3a4SNikola Tesic   llvm::StringRef OrigDIVerifyBugsReportFilePath;
166*b5b6d3a4SNikola Tesic   DebugifyStatsMap *StatsMap;
167*b5b6d3a4SNikola Tesic   DebugInfoPerPass *DebugInfoBeforePass;
168*b5b6d3a4SNikola Tesic   enum DebugifyMode Mode;
169*b5b6d3a4SNikola Tesic   bool Strip;
170*b5b6d3a4SNikola Tesic public:
171*b5b6d3a4SNikola Tesic   NewPMCheckDebugifyPass(
172*b5b6d3a4SNikola Tesic       bool Strip = false, llvm::StringRef NameOfWrappedPass = "",
173*b5b6d3a4SNikola Tesic       DebugifyStatsMap *StatsMap = nullptr,
174*b5b6d3a4SNikola Tesic       enum DebugifyMode Mode = DebugifyMode::SyntheticDebugInfo,
175*b5b6d3a4SNikola Tesic       DebugInfoPerPass *DebugInfoBeforePass = nullptr,
176*b5b6d3a4SNikola Tesic       llvm::StringRef OrigDIVerifyBugsReportFilePath = "")
NameOfWrappedPass(NameOfWrappedPass)177*b5b6d3a4SNikola Tesic       : NameOfWrappedPass(NameOfWrappedPass),
178*b5b6d3a4SNikola Tesic         OrigDIVerifyBugsReportFilePath(OrigDIVerifyBugsReportFilePath),
179*b5b6d3a4SNikola Tesic         StatsMap(StatsMap), DebugInfoBeforePass(DebugInfoBeforePass), Mode(Mode),
180*b5b6d3a4SNikola Tesic         Strip(Strip) {}
181*b5b6d3a4SNikola Tesic 
18225ee8613SDaniel Sanders   llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM);
18325ee8613SDaniel Sanders };
18425ee8613SDaniel Sanders 
1851a2b3536SDjordje Todorovic namespace llvm {
1861a2b3536SDjordje Todorovic void exportDebugifyStats(StringRef Path, const DebugifyStatsMap &Map);
1871a2b3536SDjordje Todorovic 
188*b5b6d3a4SNikola Tesic class DebugifyEachInstrumentation {
189*b5b6d3a4SNikola Tesic   llvm::StringRef OrigDIVerifyBugsReportFilePath = "";
190*b5b6d3a4SNikola Tesic   DebugInfoPerPass *DebugInfoBeforePass = nullptr;
191*b5b6d3a4SNikola Tesic   enum DebugifyMode Mode = DebugifyMode::NoDebugify;
192*b5b6d3a4SNikola Tesic   DebugifyStatsMap *DIStatsMap = nullptr;
193*b5b6d3a4SNikola Tesic 
194*b5b6d3a4SNikola Tesic public:
19598b93385SFangrui Song 
19698b93385SFangrui Song   void registerCallbacks(PassInstrumentationCallbacks &PIC);
197*b5b6d3a4SNikola Tesic   // Used within DebugifyMode::SyntheticDebugInfo mode.
setDIStatsMap(DebugifyStatsMap & StatMap)198*b5b6d3a4SNikola Tesic   void setDIStatsMap(DebugifyStatsMap &StatMap) { DIStatsMap = &StatMap; }
getDebugifyStatsMap()199*b5b6d3a4SNikola Tesic   const DebugifyStatsMap &getDebugifyStatsMap() const { return *DIStatsMap; }
200*b5b6d3a4SNikola Tesic   // Used within DebugifyMode::OriginalDebugInfo mode.
setDebugInfoBeforePass(DebugInfoPerPass & PerPassMap)201*b5b6d3a4SNikola Tesic   void setDebugInfoBeforePass(DebugInfoPerPass &PerPassMap) {
202*b5b6d3a4SNikola Tesic     DebugInfoBeforePass = &PerPassMap;
203*b5b6d3a4SNikola Tesic   }
getDebugInfoPerPass()204*b5b6d3a4SNikola Tesic   DebugInfoPerPass &getDebugInfoPerPass() { return *DebugInfoBeforePass; }
205*b5b6d3a4SNikola Tesic 
setOrigDIVerifyBugsReportFilePath(StringRef BugsReportFilePath)206*b5b6d3a4SNikola Tesic   void setOrigDIVerifyBugsReportFilePath(StringRef BugsReportFilePath) {
207*b5b6d3a4SNikola Tesic     OrigDIVerifyBugsReportFilePath = BugsReportFilePath;
208*b5b6d3a4SNikola Tesic   }
getOrigDIVerifyBugsReportFilePath()209*b5b6d3a4SNikola Tesic   StringRef getOrigDIVerifyBugsReportFilePath() const {
210*b5b6d3a4SNikola Tesic     return OrigDIVerifyBugsReportFilePath;
211*b5b6d3a4SNikola Tesic   }
212*b5b6d3a4SNikola Tesic 
setDebugifyMode(enum DebugifyMode M)213*b5b6d3a4SNikola Tesic   void setDebugifyMode(enum DebugifyMode M) { Mode = M; }
214*b5b6d3a4SNikola Tesic 
isSyntheticDebugInfo()215*b5b6d3a4SNikola Tesic   bool isSyntheticDebugInfo() const {
216*b5b6d3a4SNikola Tesic     return Mode == DebugifyMode::SyntheticDebugInfo;
217*b5b6d3a4SNikola Tesic   }
isOriginalDebugInfoMode()218*b5b6d3a4SNikola Tesic   bool isOriginalDebugInfoMode() const {
219*b5b6d3a4SNikola Tesic     return Mode == DebugifyMode::OriginalDebugInfo;
220*b5b6d3a4SNikola Tesic   }
22198b93385SFangrui Song };
22298b93385SFangrui Song 
22330b015dbSDjordje Todorovic /// DebugifyCustomPassManager wraps each pass with the debugify passes if
22430b015dbSDjordje Todorovic /// needed.
22530b015dbSDjordje Todorovic /// NOTE: We support legacy custom pass manager only.
22630b015dbSDjordje Todorovic /// TODO: Add New PM support for custom pass manager.
22730b015dbSDjordje Todorovic class DebugifyCustomPassManager : public legacy::PassManager {
2289f41c03fSDjordje Todorovic   StringRef OrigDIVerifyBugsReportFilePath;
2291a2b3536SDjordje Todorovic   DebugifyStatsMap *DIStatsMap = nullptr;
23073777b4cSDjordje Todorovic   DebugInfoPerPass *DebugInfoBeforePass = nullptr;
2311a2b3536SDjordje Todorovic   enum DebugifyMode Mode = DebugifyMode::NoDebugify;
23230b015dbSDjordje Todorovic 
23330b015dbSDjordje Todorovic public:
23430b015dbSDjordje Todorovic   using super = legacy::PassManager;
23530b015dbSDjordje Todorovic 
add(Pass * P)23630b015dbSDjordje Todorovic   void add(Pass *P) override {
23730b015dbSDjordje Todorovic     // Wrap each pass with (-check)-debugify passes if requested, making
23830b015dbSDjordje Todorovic     // exceptions for passes which shouldn't see -debugify instrumentation.
2399f41c03fSDjordje Todorovic     bool WrapWithDebugify = Mode != DebugifyMode::NoDebugify &&
2401a2b3536SDjordje Todorovic                             !P->getAsImmutablePass() && !isIRPrintingPass(P) &&
2411a2b3536SDjordje Todorovic                             !isBitcodeWriterPass(P);
24230b015dbSDjordje Todorovic     if (!WrapWithDebugify) {
24330b015dbSDjordje Todorovic       super::add(P);
24430b015dbSDjordje Todorovic       return;
24530b015dbSDjordje Todorovic     }
24630b015dbSDjordje Todorovic 
2471a2b3536SDjordje Todorovic     // Either apply -debugify/-check-debugify before/after each pass and collect
2481a2b3536SDjordje Todorovic     // debug info loss statistics, or collect and check original debug info in
2491a2b3536SDjordje Todorovic     // the optimizations.
25030b015dbSDjordje Todorovic     PassKind Kind = P->getPassKind();
25130b015dbSDjordje Todorovic     StringRef Name = P->getPassName();
25230b015dbSDjordje Todorovic 
25330b015dbSDjordje Todorovic     // TODO: Implement Debugify for LoopPass.
25430b015dbSDjordje Todorovic     switch (Kind) {
25530b015dbSDjordje Todorovic     case PT_Function:
25673777b4cSDjordje Todorovic       super::add(createDebugifyFunctionPass(Mode, Name, DebugInfoBeforePass));
25730b015dbSDjordje Todorovic       super::add(P);
2581a2b3536SDjordje Todorovic       super::add(createCheckDebugifyFunctionPass(
25973777b4cSDjordje Todorovic           isSyntheticDebugInfo(), Name, DIStatsMap, Mode, DebugInfoBeforePass,
2609f41c03fSDjordje Todorovic           OrigDIVerifyBugsReportFilePath));
26130b015dbSDjordje Todorovic       break;
26230b015dbSDjordje Todorovic     case PT_Module:
26373777b4cSDjordje Todorovic       super::add(createDebugifyModulePass(Mode, Name, DebugInfoBeforePass));
26430b015dbSDjordje Todorovic       super::add(P);
2651a2b3536SDjordje Todorovic       super::add(createCheckDebugifyModulePass(
26673777b4cSDjordje Todorovic           isSyntheticDebugInfo(), Name, DIStatsMap, Mode, DebugInfoBeforePass,
2679f41c03fSDjordje Todorovic           OrigDIVerifyBugsReportFilePath));
26830b015dbSDjordje Todorovic       break;
26930b015dbSDjordje Todorovic     default:
27030b015dbSDjordje Todorovic       super::add(P);
27130b015dbSDjordje Todorovic       break;
27230b015dbSDjordje Todorovic     }
27330b015dbSDjordje Todorovic   }
27430b015dbSDjordje Todorovic 
2751a2b3536SDjordje Todorovic   // Used within DebugifyMode::SyntheticDebugInfo mode.
setDIStatsMap(DebugifyStatsMap & StatMap)2761a2b3536SDjordje Todorovic   void setDIStatsMap(DebugifyStatsMap &StatMap) { DIStatsMap = &StatMap; }
2771a2b3536SDjordje Todorovic   // Used within DebugifyMode::OriginalDebugInfo mode.
setDebugInfoBeforePass(DebugInfoPerPass & PerPassDI)27873777b4cSDjordje Todorovic   void setDebugInfoBeforePass(DebugInfoPerPass &PerPassDI) {
27973777b4cSDjordje Todorovic     DebugInfoBeforePass = &PerPassDI;
2801a2b3536SDjordje Todorovic   }
setOrigDIVerifyBugsReportFilePath(StringRef BugsReportFilePath)2819f41c03fSDjordje Todorovic   void setOrigDIVerifyBugsReportFilePath(StringRef BugsReportFilePath) {
2829f41c03fSDjordje Todorovic     OrigDIVerifyBugsReportFilePath = BugsReportFilePath;
2839f41c03fSDjordje Todorovic   }
getOrigDIVerifyBugsReportFilePath()2849f41c03fSDjordje Todorovic   StringRef getOrigDIVerifyBugsReportFilePath() const {
2859f41c03fSDjordje Todorovic     return OrigDIVerifyBugsReportFilePath;
2869f41c03fSDjordje Todorovic   }
2879f41c03fSDjordje Todorovic 
setDebugifyMode(enum DebugifyMode M)2881a2b3536SDjordje Todorovic   void setDebugifyMode(enum DebugifyMode M) { Mode = M; }
28930b015dbSDjordje Todorovic 
isSyntheticDebugInfo()2901a2b3536SDjordje Todorovic   bool isSyntheticDebugInfo() const {
2911a2b3536SDjordje Todorovic     return Mode == DebugifyMode::SyntheticDebugInfo;
2921a2b3536SDjordje Todorovic   }
isOriginalDebugInfoMode()2931a2b3536SDjordje Todorovic   bool isOriginalDebugInfoMode() const {
2941a2b3536SDjordje Todorovic     return Mode == DebugifyMode::OriginalDebugInfo;
2951a2b3536SDjordje Todorovic   }
2961a2b3536SDjordje Todorovic 
getDebugifyStatsMap()2971a2b3536SDjordje Todorovic   const DebugifyStatsMap &getDebugifyStatsMap() const { return *DIStatsMap; }
getDebugInfoPerPass()29873777b4cSDjordje Todorovic   DebugInfoPerPass &getDebugInfoPerPass() { return *DebugInfoBeforePass; }
29930b015dbSDjordje Todorovic };
30030b015dbSDjordje Todorovic } // namespace llvm
30130b015dbSDjordje Todorovic 
302aa5c09beSKazu Hirata #endif // LLVM_TRANSFORMS_UTILS_DEBUGIFY_H
303