Index: test/tools/llvm-dwarfdump/X86/statistics.ll =================================================================== --- test/tools/llvm-dwarfdump/X86/statistics.ll +++ test/tools/llvm-dwarfdump/X86/statistics.ll @@ -1,6 +1,6 @@ ; RUN: llc -O0 %s -o - -filetype=obj \ ; RUN: | llvm-dwarfdump -statistics - | FileCheck %s -; CHECK: "version":1 +; CHECK: "version":2 ; int GlobalConst = 42; ; int Global; Index: test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll =================================================================== --- test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll +++ test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll @@ -4,7 +4,7 @@ ; Test that abstract origins in multiple CUs are uniqued. ; CHECK: "source functions":4, -; CHECK-SAME: "inlined functions":5, +; CHECK-SAME: "inlined functions":2, ; CHECK-SAME: "unique source variables":4 ; CHECK-SAME: "source variables":6 ; CHECK-SAME: "variables with location":6 Index: test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll =================================================================== --- test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll +++ test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll @@ -5,7 +5,7 @@ ; The results for both tests should be identical. ; CHECK: "source functions":4, -; CHECK-SAME: "inlined functions":5, +; CHECK-SAME: "inlined functions":2, ; CHECK-SAME: "unique source variables":4 ; CHECK-SAME: "source variables":6 ; CHECK-SAME: "variables with location":6 Index: tools/llvm-dwarfdump/Statistics.cpp =================================================================== --- tools/llvm-dwarfdump/Statistics.cpp +++ tools/llvm-dwarfdump/Statistics.cpp @@ -23,6 +23,9 @@ StringSet<> VarsInFunction; /// Compile units also cover a PC range, but have this flag set to false. bool IsFunction = false; + /// Verify function definition has PC addresses (for detecting when + /// a function has been inlined everywhere). + bool HasPCAddresses = false; }; /// Holds accumulated global statistics about DIEs. @@ -136,8 +139,10 @@ GlobalStats.ScopeBytesFromFirstDefinition += BytesInScope; assert(GlobalStats.ScopeBytesCovered <= GlobalStats.ScopeBytesFromFirstDefinition); - } else { + } else if (Die.getTag() == dwarf::DW_TAG_member) { FnStats.ConstantMembers++; + } else { + FnStats.TotalVarWithLoc += (unsigned)HasLoc; } } @@ -164,6 +169,19 @@ if (Die.find(dwarf::DW_AT_declaration)) return; + // PC Ranges. + auto RangesOrError = Die.getAddressRanges(); + if (!RangesOrError) { + llvm::consumeError(RangesOrError.takeError()); + return; + } + + auto Ranges = RangesOrError.get(); + uint64_t BytesInThisScope = 0; + for (auto Range : Ranges) + BytesInThisScope += Range.HighPC - Range.LowPC; + ScopeLowPC = getLowPC(Die); + // Count the function. if (!IsBlock) { StringRef Name = Die.getName(DINameKind::LinkageName); @@ -175,23 +193,13 @@ return; // We've seen an (inlined) instance of this function. auto &FnStats = FnStatMap[Name]; - FnStats.NumFnInlined++; + if (IsInlinedFunction) + FnStats.NumFnInlined++; FnStats.IsFunction = true; + if (BytesInThisScope && !IsInlinedFunction) + FnStats.HasPCAddresses = true; } - // PC Ranges. - auto RangesOrError = Die.getAddressRanges(); - if (!RangesOrError) { - llvm::consumeError(RangesOrError.takeError()); - return; - } - - auto Ranges = RangesOrError.get(); - uint64_t BytesInThisScope = 0; - for (auto Range : Ranges) - BytesInThisScope += Range.HighPC - Range.LowPC; - ScopeLowPC = getLowPC(Die); - if (BytesInThisScope) { BytesInScope = BytesInThisScope; if (IsFunction) @@ -258,7 +266,7 @@ /// The version number should be increased every time the algorithm is changed /// (including bug fixes). New metrics may be added without increasing the /// version. - unsigned Version = 1; + unsigned Version = 2; unsigned VarTotal = 0; unsigned VarUnique = 0; unsigned VarWithLoc = 0; @@ -267,9 +275,12 @@ for (auto &Entry : Statistics) { PerFunctionStats &Stats = Entry.getValue(); unsigned TotalVars = Stats.VarsInFunction.size() * Stats.NumFnInlined; + // Count variables in concrete out-of-line functions and in global scope. + if (Stats.HasPCAddresses || !Stats.IsFunction) + TotalVars += Stats.VarsInFunction.size(); unsigned Constants = Stats.ConstantMembers; VarWithLoc += Stats.TotalVarWithLoc + Constants; - VarTotal += TotalVars + Constants; + VarTotal += TotalVars; VarUnique += Stats.VarsInFunction.size(); LLVM_DEBUG(for (auto &V : Stats.VarsInFunction) llvm::dbgs() << Entry.getKey() << ": " << V.getKey() << "\n");