]> granicus.if.org Git - llvm/commitdiff
lvm-dwarfdump: Stop counting out-of-line subprogram in the "inlined functions" statistic.
authorCaroline Tice <cmtice@google.com>
Fri, 8 Feb 2019 00:51:33 +0000 (00:51 +0000)
committerCaroline Tice <cmtice@google.com>
Fri, 8 Feb 2019 00:51:33 +0000 (00:51 +0000)
DW_TAG_subprogram DIEs should not be counted in the inlined function statistic. This also addresses the source variables count, as that uses the inlined function count in its calculations.

Differential revision: https://reviews.llvm.org/D57849

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353491 91177308-0d34-0410-b5e6-96231b3b80d8

test/tools/llvm-dwarfdump/X86/statistics.ll
test/tools/llvm-dwarfdump/X86/stats-inlining-multi-cu.ll
test/tools/llvm-dwarfdump/X86/stats-inlining-single-cu.ll
tools/llvm-dwarfdump/Statistics.cpp

index 0ddae7e39acb4a8fc6e8d5ab8307998cb945b690..73c56dabf87e4a3c2571b1f7e3cf8da0d130d774 100644 (file)
@@ -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 f8656e6a7b718fe0fcb7e61a56ab3c3bf726af62..e6e193c2004dab89034887796cb61eee8f2ea4ad 100644 (file)
@@ -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 14ef709613278e56b86859dd6f298792c6955b75..5a4c3541a5c44c9210a143f447b3f0da7b422da4 100644 (file)
@@ -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 5fe7e8b4615b8f5b3659ada76310353ea3c64a79..a01a5017c59f7994db487d7958407ee60f9cad48 100644 (file)
@@ -23,6 +23,9 @@ struct PerFunctionStats {
   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 @@ static void collectStatsForDie(DWARFDie Die, std::string FnPrefix,
     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 @@ static void collectStatsRecursive(DWARFDie Die, std::string FnPrefix,
     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 @@ static void collectStatsRecursive(DWARFDie Die, std::string FnPrefix,
         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 @@ bool collectStatsForObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
   /// 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 @@ bool collectStatsForObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
   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");