1 //===- Debugify.h - Attach synthetic debug info to everything -------------===// 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 /// \file Interface to the `debugify` synthetic debug info testing utility. 10 /// 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_TRANSFORM_UTILS_DEBUGIFY_H 14 #define LLVM_TRANSFORM_UTILS_DEBUGIFY_H 15 16 #include "llvm/ADT/StringRef.h" 17 #include "llvm/ADT/MapVector.h" 18 #include "llvm/IR/PassManager.h" 19 20 llvm::ModulePass *createDebugifyModulePass(); 21 llvm::FunctionPass *createDebugifyFunctionPass(); 22 23 struct NewPMDebugifyPass : public llvm::PassInfoMixin<NewPMDebugifyPass> { 24 llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); 25 }; 26 27 /// Track how much `debugify` information has been lost. 28 struct DebugifyStatistics { 29 /// Number of missing dbg.values. 30 unsigned NumDbgValuesMissing = 0; 31 32 /// Number of dbg.values expected. 33 unsigned NumDbgValuesExpected = 0; 34 35 /// Number of instructions with empty debug locations. 36 unsigned NumDbgLocsMissing = 0; 37 38 /// Number of instructions expected to have debug locations. 39 unsigned NumDbgLocsExpected = 0; 40 41 /// Get the ratio of missing/expected dbg.values. 42 float getMissingValueRatio() const { 43 return float(NumDbgValuesMissing) / float(NumDbgLocsExpected); 44 } 45 46 /// Get the ratio of missing/expected instructions with locations. 47 float getEmptyLocationRatio() const { 48 return float(NumDbgLocsMissing) / float(NumDbgLocsExpected); 49 } 50 }; 51 52 /// Map pass names to a per-pass DebugifyStatistics instance. 53 using DebugifyStatsMap = llvm::MapVector<llvm::StringRef, DebugifyStatistics>; 54 55 llvm::ModulePass * 56 createCheckDebugifyModulePass(bool Strip = false, 57 llvm::StringRef NameOfWrappedPass = "", 58 DebugifyStatsMap *StatsMap = nullptr); 59 60 llvm::FunctionPass * 61 createCheckDebugifyFunctionPass(bool Strip = false, 62 llvm::StringRef NameOfWrappedPass = "", 63 DebugifyStatsMap *StatsMap = nullptr); 64 65 struct NewPMCheckDebugifyPass 66 : public llvm::PassInfoMixin<NewPMCheckDebugifyPass> { 67 llvm::PreservedAnalyses run(llvm::Module &M, llvm::ModuleAnalysisManager &AM); 68 }; 69 70 #endif // LLVM_TRANSFORM_UTILS_DEBUGIFY_H 71