diff --git a/llvm/docs/HowToUpdateDebugInfo.rst b/llvm/docs/HowToUpdateDebugInfo.rst --- a/llvm/docs/HowToUpdateDebugInfo.rst +++ b/llvm/docs/HowToUpdateDebugInfo.rst @@ -361,6 +361,18 @@ # Check the preservation of original Debug Info after each pass. $ opt -verify-each-debuginfo-preserve -O2 sample.ll +Limit number of observed functions to speed up the analysis: + +.. code-block:: bash + + # Test up to 100 functions (per compile unit) per pass. + $ opt -verify-each-debuginfo-preserve -O2 -debugify-func-limit=100 sample.ll + +Please do note that running ``-verify-each-debuginfo-preserve`` on big projects +could be heavily time consuming. Therefore, we suggest using +``-debugify-func-limit`` with a suitable limit number to prevent extremely long +builds. + Furthermore, there is a way to export the issues that have been found into a JSON file as follows: diff --git a/llvm/lib/Transforms/Utils/Debugify.cpp b/llvm/lib/Transforms/Utils/Debugify.cpp --- a/llvm/lib/Transforms/Utils/Debugify.cpp +++ b/llvm/lib/Transforms/Utils/Debugify.cpp @@ -37,6 +37,11 @@ cl::opt Quiet("debugify-quiet", cl::desc("Suppress verbose debugify output")); +cl::opt DebugifyFunctionsLimit( + "debugify-func-limit", + cl::desc("Set max number of processed functions per pass."), + cl::init(UINT_MAX)); + enum class Level { Locations, LocationsAndVariables @@ -292,6 +297,7 @@ return false; } + uint64_t FunctionsCnt = DebugInfoBeforePass.DIFunctions.size(); // Visit each instruction. for (Function &F : Functions) { // Use DI collected after previous Pass (when -debugify-each is used). @@ -301,6 +307,9 @@ if (isFunctionSkipped(F)) continue; + // Stop collecting DI if the Functions number reached the limit. + if (++FunctionsCnt >= DebugifyFunctionsLimit) + break; // Collect the DISubprogram. auto *SP = F.getSubprogram(); DebugInfoBeforePass.DIFunctions.insert({&F, SP}); @@ -535,6 +544,9 @@ if (isFunctionSkipped(F)) continue; + // Don't process functions without DI collected before the Pass. + if (!DebugInfoBeforePass.DIFunctions.count(&F)) + continue; // TODO: Collect metadata other than DISubprograms. // Collect the DISubprogram. auto *SP = F.getSubprogram(); diff --git a/llvm/test/Transforms/Util/Debugify/loc-only-original-mode.ll b/llvm/test/Transforms/Util/Debugify/loc-only-original-mode.ll --- a/llvm/test/Transforms/Util/Debugify/loc-only-original-mode.ll +++ b/llvm/test/Transforms/Util/Debugify/loc-only-original-mode.ll @@ -6,6 +6,15 @@ ; RUN: -verify-each-debuginfo-preserve \ ; RUN: -debugify-level=location+variables -S 2>&1 | FileCheck %s --check-prefix=CHECK-DROP +; RUN: opt < %s -deadargelim -enable-new-pm=false \ +; RUN: -verify-each-debuginfo-preserve \ +; RUN: -debugify-func-limit=0 -S 2>&1 | FileCheck %s + +; RUN: opt < %s -deadargelim -enable-new-pm=false \ +; RUN: -verify-each-debuginfo-preserve \ +; RUN: -debugify-func-limit=2 -S 2>&1 | FileCheck %s --check-prefix=CHECK-DROP + + ; CHECK-NOT: drops dbg.value()/dbg.declare() ; CHECK-DROP: drops dbg.value()/dbg.declare()