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